package com.niuwa.p2p.core.file;

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.im4java.core.IM4JavaException;
import net.coobird.thumbnailator.Thumbnails;

/**
 * 
 * @title 图片处理工具2
 *
 * @author tennyqin
 * @version 1.0
 * @created 2015年4月29日
 */
public class ImageMagick {

	/**
	 * 根据尺寸缩放图片[等比例缩放:参数height为null,按宽度缩放比例缩放;参数width为null,按高度缩放比例缩放]
	 * 
	 * @param imagePath
	 *            源图片路径
	 * @param newPath
	 *            处理后图片路径
	 * @param width
	 *            缩放后的图片宽度
	 * @param height
	 *            缩放后的图片高度
	 * @return 返回true说明缩放成功,否则失败
	 */
	public static void zoomImage(String imagePath, String newPath,
			Integer width, Integer height) throws Exception {
		if (null == height) {
			height = ImageMagick.getHeight(imagePath);
		}
		if (null == width) {
			width = ImageMagick.getWidth(imagePath);
		}
		Thumbnails.of(imagePath).size(width, height).toFile(newPath);
	}

	/**
	 * 获取图片信息高度
	 * 
	 * @throws Exception
	 */
	public static int getHeight(String originalImage) throws Exception {
		int height = Thumbnails.of(originalImage).scale(1.00f)
				.asBufferedImage().getHeight();
		return height;
	}

	/**
	 * 获取图片信息宽度
	 * @throws Exception
	 */
	public static int getWidth(String originalImage) throws Exception {
		int width = Thumbnails.of(originalImage).scale(1.00f).asBufferedImage()
				.getWidth();
		return width;
	}

	/**
	 * 图片等比例压缩 [默认原图片大小0.95]
	 * 
	 * @param imagePath
	 *            文件路径
	 * @param scaleSize
	 *            比例大小图片压缩比，有效值范围是0.10-1.00，数值越大，缩略图越清晰
	 * @throws IM4JavaException
	 * @throws InterruptedException
	 * @throws IOException
	 */

	public static void scaleImage(String imagePath, String newpath,
			float scaleSize) throws Exception {
		Thumbnails.of(imagePath).scale(scaleSize).toFile(newpath);
	}

	/***
	 * 根据指定大小进行缩放 不按照比例
	 * 
	 * @throws Exception
	 */
	public static void zoomImage2(String imagePath, String newPath,
			Integer width, Integer height) throws Exception {
		Thumbnails.of(imagePath).size(width, height)
		// 设置是否按比例 false 图片可能会走形 默认true
				.keepAspectRatio(false).toFile(newPath);
	}

	/**
	 * 改变图片格式
	 * 
	 * @param imagePath
	 *            图片原文件
	 * @param newpath
	 *            输出文件
	 * @param imageType
	 *            需要转换后的图片格式
	 * @throws Exception
	 */
	public void changeImageType(String imagePath, String newpath,
			String imageType) throws Exception {
		Thumbnails.of(imagePath).scale(1.00f).outputFormat(imageType)
				.toFile(newpath);
	}

	/**
	 * 给图片添加图片水印
	 * 
	 * @param pressImg
	 *            水印图片
	 * @param srcImageFile
	 *            源图像地址
	 * @param destImageFile
	 *            目标图像地址
	 * @param x
	 *            修正值。 默认在中间
	 * @param y
	 *            修正值。 默认在中间
	 * @param alpha
	 *            透明度：alpha 必须是范围 [0.0, 1.0] 之内（包含边界值）的一个浮点数字
	 */
	public static void waterMark(String pressImg, String srcImageFile,
			String destImageFile, float alpha, String imageType) {
		try {
			File img = new File(srcImageFile);
			Image src = ImageIO.read(img);
			int wideth = src.getWidth(null);
			int height = src.getHeight(null);
			BufferedImage image = new BufferedImage(wideth, height,
					BufferedImage.TYPE_INT_RGB);
			Graphics2D g = image.createGraphics();
			g.drawImage(src, 0, 0, wideth, height, null);
			// 水印文件
			Image src_biao = ImageIO.read(new File(pressImg));
			int wideth_biao = src_biao.getWidth(null);
			int height_biao = src_biao.getHeight(null);
			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
					alpha));
			g.drawImage(src_biao, (wideth - wideth_biao) / 2,
					(height - height_biao) / 2, wideth_biao, height_biao, null);
			// 水印文件结束
			g.dispose();
			ImageIO.write((BufferedImage) image, imageType, new File(
					destImageFile));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
